qx.Class.define("caraffa.widgets.Turnos",
{
	extend : qx.ui.form.ow.FormTab,
	construct : function (horaInicio, horaFin, cod_clinica)
	{
		cod_clinica ? this.cod_clinica = cod_clinica : this.cod_clinica = 1;
		
		if (this.cod_clinica == 1) {
			this.base(arguments, "TurnosZipoli", "Turnos Zipoli");
		} else {
			this.base(arguments, "TurnosAvellaneda", "Turnos Avellaneda");
		}
		

		horaInicio ? this._horaInicio = horaInicio : this._horaInicio = 8;
		horaFin ? this._horaFin = horaFin : this._horaFin = 23;
		
		
		
		this._txdFecha = new qx.ui.form.DateField().set({dateFormat:new qx.util.format.DateFormat("dd/MM/yyyy")});
		this._txdFecha.setValue(new Date());
		
        this._cmbMedico = new qx.ui.form.ow.ComboFilter("Medico:", "", true);
        this._cmbMedico.getLabel().setWidth(60);
        this._cmbMedico.getCombo().setWidth(250);

        this._btnBloquear = new qx.ui.form.Button("Bloquear Hora");

        this._btnImprimirTurnos = new qx.ui.form.Button("", "caraffa/16/imprimir.png").set({width:0});
//        var json = this._getDataToGrid();
        
        var model = new qx.ui.table.model.Simple();
		model.setColumns(["", "", "", "", "", "", "", ""]);

		this._grid = new qx.ui.table.Table(model);
		
		this._getDataToGrid();

//
//        var model = new qx.ui.table.model.Simple();
//		model.setColumns(json.dias);
//		model.setColumnSortable(0, false);
//		model.setColumnSortable(1, false);
//		model.setColumnSortable(2, false);
//		model.setColumnSortable(3, false);
//		model.setColumnSortable(4, false);
//		model.setColumnSortable(5, false);
//		model.setColumnSortable(6, false);
//		model.setColumnSortable(7, false);
//		model.setData(json.horas);

		
		this._grid.setColumnVisibilityButtonVisible(false);
		var newRenderer = new qx.ui.table.cellrenderer.Conditional("center", "", "", "");
		newRenderer.addNumericCondition(">=", 0, "center", "#359d02", "", "bold");
		newRenderer.addNumericCondition(">=", 2, "center", "#ffa800", "", "bold");
		newRenderer.addNumericCondition(">=", 4, "center", "#ff0000", "", "bold");
		for (var i=1;i<=7;i++)
		{
			this._grid.getTableColumnModel().setDataCellRenderer(i, new qx.ui.table.cellrenderer.Html());
		}
		
		this._grid.setColumnWidth(0, 60);
		for (var i=1;i<=7;i++)
		{
			this._grid.setColumnWidth(i, 80);
		}
				
		this._grid.setWidth(630);
		this._grid.setHeight(365);
		this._grid.setStatusBarVisible(false);
					
		this.add(this._txdFecha, {left:10, top:10});
		this.add(this._cmbMedico, {left:160, top:10});
		this.add(this._btnImprimirTurnos, {left:500, top:10});
		this.add(this._btnBloquear, {left:550, top:10});
		this.add(this._grid, {left:10, top:40});
		
		
		this._initWidget();
	},
	members : 
	{
		_txdFecha : null,
		_cmbMedico : null,
		_grid : null,
		_horaInicio : null,
		_horaFin : null,
		_initWidget : function ()
		{
			this._btnImprimirTurnos.addListener("execute", function () {
//				if (caraffa.Funciones.remoto != "caraffa") {
//					alert("No puede imprimir este Listado remotamente.");
//				} else {
					if ((this._txdFecha.getDateFormat().format(this._txdFecha.getValue())) && (this._cmbMedico.getValue())) {
						var fecha = this._txdFecha.getDateFormat().format(this._txdFecha.getValue());
						fecha = fecha.substr(6,4) + "-" + fecha.substr(3,2) + "-" + fecha.substr(0,2);
						window.open('reports/listado_turnos_medico.php?dni_usuario=' + this._cmbMedico.getValue() + "&fecha=" + fecha + "&medico=" + this._cmbMedico.getValueDisplay() + "&cod_clinica=" + this.cod_clinica,'','left=10,top=10,width=900,height=600,scrollbars=1');
					} else {
						alert("Seleccione una Fecha y un Medico");
					}
//				}
			}, this);
			
			var rpc = new qx.io.remote.Rpc();
			rpc.setTimeout(10000);
//			if (caraffa.Funciones.remoto != "caraffa") {
//				rpc.setUrl(caraffa.Funciones.rpcRemoto);
//				rpc.setCrossDomain(true);
//			} else {
				rpc.setUrl(caraffa.Funciones.rpcLocal);
//			}
	        rpc.setServiceName("turnos");
//	        try
//	        {
//				var result = rpc.callSync("getMedicos");
//				for (var i in result)
//				{
//					this._cmbMedico.addValue({value:result[i].dni_usuario, label:result[i].apeynom});
//				}
//			}
//			catch (ex)
//			{
//				alert(ex);
//			}
	        
	        var app = this;
	        rpc.callAsync(function (result, ex, id) {
	        	if (ex == null) {
	        		for (var i in result) {
						app._cmbMedico.addValue({value:result[i].dni_usuario, label:result[i].apeynom});
					}
	        	} else {
	        		alert(ex);
	        	}
	        },"getMedicos");

			this._txdFecha.addListener("changeValue", function ()
			{
				this._getDataToGrid();
//				var json = this._getDataToGrid();
//				this._grid.getTableModel().setColumns(json.dias);
//				this._grid.getTableModel().setData(json.horas);
			}, this);
			
	        this._cmbMedico.addListener("changeValue", function ()
			{
				this._getDataToGrid();
//				var json = this._getDataToGrid();
//				this._grid.getTableModel().setColumns(json.dias);
//				this._grid.getTableModel().setData(json.horas);
			}, this);
			
			this._grid.addListener("cellDblclick", this._openABMTurnos, this);
			
			this._grid.addListener("cellClick", this._bloquearDesbloquear, this);
			
			this._grid.addListener("keyup", function (e)
			{
				if ((e.getKeyIdentifier() == 'Up') || (e.getKeyIdentifier() == 'Down') || (e.getKeyIdentifier() == 'Left') || (e.getKeyIdentifier() == 'Right'))
				{
					this._bloquearDesbloquear();
				}
				else
				{
					if ((e.getKeyIdentifier() == 'Enter') && (this._grid.getTableModel().getValue(this._grid.getFocusedColumn(), this._grid.getFocusedRow()) != "<center><img src='resource/caraffa/cruz.png' /></center>"))
					{
						this._openABMTurnos();
					}
					else
					{
						if (e.getKeyIdentifier() == 'Enter')
						{
							alert("No puede asignar turnos en este dia y hora, ya que el medico no se encuentra disponible");
						}
					}
				}
				
			}, this);
			
			this._btnBloquear.addListener("execute", function (e)
			{
				if (this._cmbMedico.getValue() != "")
				{
					var fecha = this._txdFecha.getDateFormat().format(this._txdFecha.getValue());
					var params = new Object();
					params.hora = this._grid.getTableModel().getValue(0, this._grid.getFocusedRow());
					params.fecha = this._sumarDias(fecha, (this._grid.getFocusedColumn()-1));
					params.dia = this._diaFecha(this._sumarDias(fecha, (this._grid.getFocusedColumn()-1)));
					params.medico = this._cmbMedico.getValue();
					params.rango = '01:00';
					params.cod_clinica = this.cod_clinica;
					switch (this._grid.getTableModel().getValue(this._grid.getFocusedColumn(), this._grid.getFocusedRow()))
					{
						case "":
						{
							params.accion = "vacio";
							break;
						}
						case "<center><img src='resource/caraffa/cruz.png' /></center>":
						{
							params.accion = "desbloquear";
							break;
						}
						default :
						{
							params.accion = "pacientes";
							break;
						}
					}
					if (params.accion == "pacientes")
					{
						if (confirm("Esta por bloquear una hora donde se encuentran pacientes con turno. Desea continuar?"))
						{
							var sigue = true;
						}
						else
						{
							var sigue = false;
						}
					}
					else
					{
						var sigue = true;
					}
					if (sigue)
					{
						var rpc = new qx.io.remote.Rpc();
						rpc.setTimeout(10000);
//						if (caraffa.Funciones.remoto != "caraffa") {
//							rpc.setUrl(caraffa.Funciones.rpcRemoto);
//							rpc.setCrossDomain(true);
//						} else {
							rpc.setUrl(caraffa.Funciones.rpcLocal);
//						}
				        rpc.setServiceName("turnos");
				 		var app = this;
				        rpc.callAsync(function (result, ex, id) {
				        	if (ex == null) {
//					        	var json = app._getDataToGrid();
				        		app._getDataToGrid();
//								app._grid.getTableModel().setColumns(json.dias);
//								app._grid.getTableModel().setData(json.horas);
								if (params.accion == 'desbloquear')
								{
									app._btnBloquear.setLabel("Bloquear Hora");
								}
								else
								{
									app._btnBloquear.setLabel("Desbloquear Hora");
								}
								params = null;
								var json = null;
				        	} else {
				        		alert(ex);
				        	}
				        }, "bloquearHoraMedico", params);
//				        try
//				        {
//							var result = rpc.callSync("bloquearHoraMedico", params);
//							var json = this._getDataToGrid();
//							this._grid.getTableModel().setColumns(json.dias);
//							this._grid.getTableModel().setData(json.horas);
//							if (params.accion == 'desbloquear')
//							{
//								this._btnBloquear.setLabel("Bloquear Hora");
//							}
//							else
//							{
//								this._btnBloquear.setLabel("Desbloquear Hora");
//							}
//							params = null;
//							json = null;
//							
//	//						alert(result);
//						}
//						catch (ex)
//						{
//							alert(ex);
//						}
					}
				}
				else
				{
					alert("Debe seleccionar el medico al cual quiere bloquearle alguna hora");
				}
			}, this);
			this._cmbMedico.focus();
		},
		_openABMTurnos : function ()
		{
			var fecha = this._txdFecha.getDateFormat().format(this._txdFecha.getValue());
			if (this._cmbMedico.getValue())
			{
				if (this._grid.getTableModel().getValue(this._grid.getFocusedColumn(), this._grid.getFocusedRow()) == "<center><img src='resource/caraffa/cruz.png' /></center>")
				{
					alert("No puede asignar turnos en este dia y hora, ya que el medico no se encuentra disponible");
				}
				else
				{
					var win = new qx.ui.window.Window("Carga de Turno: " + this._cmbMedico.getValueDisplay() + " - " + this._sumarDias(fecha, (this._grid.getFocusedColumn())-1));
					win.addListener("resize", win.center, win);
					win.setLayout(new qx.ui.layout.VBox(10));
					win.setShowStatusbar(false);
					win.add(new caraffa.widgets.ABMTurno(this._cmbMedico.getValue(), this._sumarDias(fecha, (this._grid.getFocusedColumn())-1), this._grid.getTableModel().getValue(0, this._grid.getFocusedRow()), this.cod_clinica));

					win.addListener("close", function ()
					{
						this._getDataToGrid();
//						var json = this._getDataToGrid();
//						this._grid.getTableModel().setColumns(json.dias);
//						this._grid.getTableModel().setData(json.horas);
					}, this);
					this.add(win);
					win.open();
				}
			}
		},
		_bloquearDesbloquear : function ()
		{
			if (this._grid.getFocusedRow() != null)
			{
				this._btnBloquear.setEnabled(true);
				switch (this._grid.getTableModel().getValue(this._grid.getFocusedColumn(), this._grid.getFocusedRow()))
				{
					case "<center><img src='resource/caraffa/cruz.png' /></center>":
					{
						this._btnBloquear.setLabel("Desbloquear Hora");
						break;
					}
					default :
					{
						this._btnBloquear.setLabel("Bloquear Hora");
						break;
					}
				}
			}
			else
			{
				this._btnBloquear.setEnabled(false);
			}
		},
		_diaFecha : function(fecha)
		{
			var day = fecha.substr(0,2);
			var month = fecha.substr(3,2);
			var year = fecha.substr(6,4);
			var oyear = year;
			var wyear = "";
			var wrelyear = "";
			
			var dob = " "+ year +", "+month + ",  "+day;
			var thenx = new Date(dob);
			
			var year=thenx.getYear();
			if (year<100) year="19" + thenx.getYear();
			else year=thenx.getYear();
			
			if (year > 1969) wyear=year;
			else {
			if (oyear<1900) {
			if (oyear>1800) {
			wrelyear= (eval(oyear)-1801)%(28);
			wyear = wrelyear+1981;
			}
			else wyear = 1970 
			}
			else
			if (oyear>1900) {wrelyear= (eval(oyear)-1901)%(28); 
			wyear= wrelyear+1985
			}
			else 
			if (oyear==1900) {wyear= 1990;
			   }              
			}
			var dob = " "+ wyear +", "+month + ",  "+day;
			var thenx = new Date(dob);
			
			var theday = thenx.getDay()+1;
			var date=thenx.getDate();
			
			var weekday = new Array(6);

			weekday[1]="Domingo";
			weekday[2]="Lunes";
			weekday[3]="Martes";
			weekday[4]="Miércoles";
			weekday[5]="Jueves";
			weekday[6]="Viernes";
			weekday[7]="Sábado";
	
			return theday;
		},
		_sumarDias : function (fecha, dias)
		{
			// pasaremos la fecha a formato mm/dd/yyyy
			//fecha = this._txdFecha.getDateFormat().format(fecha);

			fecha=fecha.split('/'); 
			fecha=fecha[1]+'/'+fecha[0]+'/'+fecha[2];
			//
			
			var hoy = new Date(fecha);
			hoy.setTime(hoy.getTime()+dias*24*60*60*1000); 

			var dia = hoy.getDate();
			if (dia <= 9)
				dia='0'+dia;
			var mes = hoy.getMonth()+1; 
			if (mes <= 9)
				mes='0'+mes;
			var anio = hoy.getFullYear();
			fecha=dia+'/'+mes+'/'+anio; 
			return fecha;
		},
		_getDataToGrid : function ()
		{
			var fecha = this._txdFecha.getValue();
			fecha = this._txdFecha.getDateFormat().format(fecha);
			var dia = this._diaFecha(fecha);
			switch (dia)
			{
				case 1: var columnas = ["Hora", "Dom " + fecha.substr(0,5), "Lun " + this._sumarDias(fecha, 1).substr(0,5), "Mar " + this._sumarDias(fecha, 2).substr(0,5), "Mie " + this._sumarDias(fecha, 3).substr(0,5), "Jue " + this._sumarDias(fecha, 4).substr(0,5), "Vie " + this._sumarDias(fecha, 5).substr(0,5), "Sab " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 2: var columnas = ["Hora", "Lun " + fecha.substr(0,5), "Mar " + this._sumarDias(fecha, 1).substr(0,5), "Mie " + this._sumarDias(fecha, 2).substr(0,5), "Jue " + this._sumarDias(fecha, 3).substr(0,5), "Vie " + this._sumarDias(fecha, 4).substr(0,5), "Sab " + this._sumarDias(fecha, 5).substr(0,5), "Dom " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 3: var columnas = ["Hora", "Mar " + fecha.substr(0,5), "Mie " + this._sumarDias(fecha, 1).substr(0,5), "Jue " + this._sumarDias(fecha, 2).substr(0,5), "Vie " + this._sumarDias(fecha, 3).substr(0,5), "Sab " + this._sumarDias(fecha, 4).substr(0,5), "Dom " + this._sumarDias(fecha, 5).substr(0,5), "Lun " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 4: var columnas = ["Hora", "Mie " + fecha.substr(0,5), "Jue " + this._sumarDias(fecha, 1).substr(0,5), "Vie " + this._sumarDias(fecha, 2).substr(0,5), "Sab " + this._sumarDias(fecha, 3).substr(0,5), "Dom " + this._sumarDias(fecha, 4).substr(0,5), "Lun " + this._sumarDias(fecha, 5).substr(0,5), "Mar " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 5: var columnas = ["Hora", "Jue " + fecha.substr(0,5), "Vie " + this._sumarDias(fecha, 1).substr(0,5), "Sab " + this._sumarDias(fecha, 2).substr(0,5), "Dom " + this._sumarDias(fecha, 3).substr(0,5), "Lun " + this._sumarDias(fecha, 4).substr(0,5), "Mar " + this._sumarDias(fecha, 5).substr(0,5), "Mie " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 6: var columnas = ["Hora", "Vie " + fecha.substr(0,5), "Sab " + this._sumarDias(fecha, 1).substr(0,5), "Dom " + this._sumarDias(fecha, 2).substr(0,5), "Lun " + this._sumarDias(fecha, 3).substr(0,5), "Mar " + this._sumarDias(fecha, 4).substr(0,5), "Mie " + this._sumarDias(fecha, 5).substr(0,5), "Jue " + this._sumarDias(fecha, 6).substr(0,5)]; break;
				case 7: var columnas = ["Hora", "Sab " + fecha.substr(0,5), "Dom " + this._sumarDias(fecha, 1).substr(0,5), "Lun " + this._sumarDias(fecha, 2).substr(0,5), "Mar " + this._sumarDias(fecha, 3).substr(0,5), "Mie " + this._sumarDias(fecha, 4).substr(0,5), "Jue " + this._sumarDias(fecha, 5).substr(0,5), "Vie " + this._sumarDias(fecha, 6).substr(0,5)]; break;
			}
			
			var json = "";
			if (this._cmbMedico.getValue())
			{
				var rpc = new qx.io.remote.Rpc();
				rpc.setTimeout(10000);
//				if (caraffa.Funciones.remoto != "caraffa") {
//					rpc.setUrl(caraffa.Funciones.rpcRemoto);
//					rpc.setCrossDomain(true);
//				} else {
					rpc.setUrl(caraffa.Funciones.rpcLocal);
//				}
		        rpc.setServiceName("turnos");
//		        try
//		        {
//					var result = rpc.callSync("getTurnosFechaMedico", fecha, this._cmbMedico.getValue());
//				}
//				catch (ex)
//				{
//					alert("Error en RPC: " + ex);
//				}
//				json = result;
		        var app = this;
		        rpc.callAsync(function (json, ex, id) {
					var horas = new Array();
					for (var i=app._horaInicio;i<=app._horaFin;i++) // La variable i lleva la hora que se esta teniendo en cuenta
					{
						var row = new Array();
		
						if (i<=9)
						{
							row.push("0" + i + ":00");
							if (json.horas != undefined)
							{
								for (var j=0;j<=6;j++) // La variable j lleva la posicion de la columna de la grilla del dia que se esta teniendo en cuenta. 
								{
									if (json.trabajo[j] != undefined)
									{
										var k = 0;
										var ban = false;
										var h = j+dia;
										if (h > 7) // Aqui h pasa a obtener el dia teniendo en cuenta j. Lo calcula ya que j solo lleva la posicion en la grilla y uno tiene que saber a que dia se refiere (ya se... un bolonqui)
										{
											h = h-7;
										}
										while (json.trabajo[j][k] != undefined) // La variable k analiza los diferentes registros de la agenda que coinciden en ese dia.
										{
		//									alert(json.trabajo[j][k].hora_desde + " - " + (parseInt(i  + "" + "00")) + " - " + json.trabajo[j][k].hora_hasta);
											if (((parseInt(i  + "" + "00")) >=json.trabajo[j][k].hora_desde) && ((parseInt(i  + "" + "00")) <json.trabajo[j][k].hora_hasta) && (json.trabajo[j][k]["d" + h] == "1") && (json.trabajo[j][k].tipo == 'L')) //Aqui se busca al menos un registro que diga que trabaja en esa hora (i) del dia (j) determinado. Recorre tantos registros (k) segun tenga el medico en ese dia (Hasta aqui, uno ya chuño del lio...).
											{
												ban = true; // Encontro un dia/hora en la agenda del medico.
												k++
												while (json.trabajo[j][k] != undefined)
												{
													if (((parseInt(i  + "" + "00")) >=json.trabajo[j][k].hora_desde) && ((parseInt(i  + "" + "00")) <json.trabajo[j][k].hora_hasta) && (json.trabajo[j][k]["d" + h] == "1") && (json.trabajo[j][k].tipo == 'N'))
													{
														ban = false;
														break;
													}
													k++
												}
												break;
											}
											k++;
										}
										if (ban) // Ingresa si es que encontro un dia/hora disponible en la agenda del medico para ver si tiene pacientes en ese dia/hora.
										{
											
											if (json.horas[i + "" + "" + h] != undefined) // Con i y h se fija si para esa hora (i) en el dia que se esta teniendo en cuenta en la grilla (h) existe un paciente.
											{
												var posicion = (json.horas[i + "" + h].dia)-dia;
												if (posicion < 0)
												{
													posicion += 7;
												}
												if (posicion == j) // Aqui tiene cuidado de que se ingrese el paciente siempre y cuando j este bien posicionado en el dia correspondiente.
												{
													row.push(parseInt(json.horas[i + "" + h].cantidad));
												}
												else
												{
													row.push("");
												}
											}
											else
											{
												row.push("");
											}
										}
										else
										{
											row.push("<center><img src='resource/caraffa/cruz.png' /></center>");
										}
									}
									else
									{
										row.push("<center><img src='resource/caraffa/cruz.png' /></center>");
									}
								}
							}
							horas.push(row);
						}
						else
						{
							row.push(i + ":00");
							// ****** TODITO LO QUE SIGUE ES = A LO ANTERIOR, NADA MAS QUE TIENE EN CUENTA LAS HORAS DESPUES DE LAS 9, Ya que no lleva el 0 adelante.
							if (json.horas != undefined)
							{
								for (var j=0;j<=6;j++)
								{
									if (json.trabajo[j] != undefined)
									{
										var k = 0;
										var ban = false;
										var h = j+dia;
										if (h > 7)
										{
											h = h-7;
										}
										while (json.trabajo[j][k] != undefined)
										{
											if ((parseInt(i  + "" + "00") >=json.trabajo[j][k].hora_desde) && (parseInt(i  + "" + "00") <json.trabajo[j][k].hora_hasta) && (json.trabajo[j][k]["d" + h] == "1") && (json.trabajo[j][k].tipo == 'L'))
											{
												//alert(json.trabajo[j][k].hora_desde + " - " + i + " - " + json.trabajo[j][k].hora_hasta);
												ban = true; // Encontro un dia/hora en la agenda del medico.
												k++
												while (json.trabajo[j][k] != undefined)
												{
													if ((parseInt(i  + "" + "00") >=json.trabajo[j][k].hora_desde) && (parseInt(i  + "" + "00") <json.trabajo[j][k].hora_hasta) && (json.trabajo[j][k]["d" + h] == "1") && (json.trabajo[j][k].tipo == 'N'))
													{
														ban = false;
														break;
													}
													k++
												}
												break;
											}
											k++;
										}
										if (ban)
										{
											if (json.horas[i + "" + h] != undefined)
											{
												var posicion = (json.horas[i + "" + h].dia)-dia;
												if (posicion < 0)
												{
													posicion += 7;
												}
												if (posicion == j)
												{
													row.push(parseInt(json.horas[i + "" + h].cantidad));
												}
												else
												{
													row.push("");
												}
											}
											else
											{
												row.push("");
											}
										}
										else
										{
											row.push("<center><img src='resource/caraffa/cruz.png' /></center>");
										}
									}
									else
									{
										row.push("<center><img src='resource/caraffa/cruz.png' /></center>");
									}
								}
							}
							horas.push(row);
						}
					}
					
					var json = new Object();
					json.dias = columnas;
					json.horas = horas;
					
					app._grid.getTableModel().setColumns(json.dias);
					app._grid.getTableModel().setData(json.horas);

		        }, "getTurnosFechaMedico", fecha, this._cmbMedico.getValue(), this.cod_clinica);
			}
			//alert(qx.util.Json.stringify(json));
			return json;
		}
	}
});
